'''
文件包含了一些方法和类的重写
'''

from PyQt5.QtCore import QRegExp,pyqtSignal
from PyQt5.QtGui import QIntValidator,QRegExpValidator,QValidator
from PyQt5.QtWidgets import *



class PortLineEdit(QLineEdit):
    '''
    扩展QLineEdit的功能，并提供了端口号验证的功能。
    '''
    class PortValidator(QIntValidator):
        '''
        验证输入是否为有效端口
        '''
        def fixup(self, inputs:str)->str:
            '''
            用于对输入的字符串进行一些预处理或修复操作，以确保输入符合特定的要求或规范。
            '''
            if len(str) == 0:
                return ""
            elif int(inputs) > 65535:
                return "7777"

            return inputs

    def __init__(self,parent=None):
        """
        初始化类的属性和方法
        """
        super().__init__(parent)
        validator = self.PortValidator(0,65535,parent)  #判断输入的端口号是否在0~65535之中
        self.setValidator(validator)        #用于设置一个验证器给QValidator对象，验证用户输入的数据是否满足一定的条件

class IPv4AddrLineEdit(QLineEdit):
    '''
    带有验证输入IPv4地址功能的LineEdit
    '''
    class IPValidator(QRegExpValidator):
        '''
        验证是否为有效IP
        '''
        def validate(self, inputs:str, pos:int)->[QValidator.State,str,int]:
            '''
            ->[QValidator.State,str,int]：这个意思代表函数返回一个列表且列表里面有三个元素
            重写父类Validate的方法，以实现将输入字符串中的中文句号转换为英文句号的方法
            '''
            # 重写validate方法以实现可以自动把中文句号转化为英文句点的功能
            inputs = inputs.replace("。",".")
            return super().validate(inputs,pos)

    # 一串神秘的正则表达式，可以验证IPv4类型的地址
    #(2[0-4]\d|25[0-5]|[01]?\d\d?)：用于匹配0~255之间的数字，由三个选择先组成：
    #   2[0-4]\d：匹配200到249之间的数字。
    #   25[0-5]：匹配250到255之间的数字。
    #   [01]?\d\d?：匹配0到199之间的数字，可以是一位或两位数字，但不允许以0开头。
    #   \.：这是一个转义字符，用于匹配点号（.）
    #   \.){3}：表示整个前面部分重读三次
    #(2[0-4]\d|25[0-5]|[01]?\d\d?)：匹配IP地址的最后一个部分。
    # QRegExp方法用于创建一个正则表达式，以便后续对字符串进行匹配操作
    reg_ex = QRegExp(
         "((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)"
    )

    def __init__(self,parent=None):
        '''
        初始化类的方法和属性
        '''
        super().__init__(parent)
        ip_input_validator = self.IPValidator(self.reg_ex,parent)       #判断输入的IP号是否正确
        self.setValidator(ip_input_validator)                #用于设置一个验证器给IPValidator对象，验证用户输入的数据是否满足一定的条件

class ConnectButton(QPushButton):
    def __init__(self,parent = None):
        '''
        初始化方法和属性
        '''
        super().__init__(parent)
        self.setCheckable(True)                     #设置对象为可检查的对象
        self.toggled.connect(self.toggled_slot)     #将对象的翻转信号绑定到槽函数


    def toggled_slot(self):
        '''
        连接按钮状态切换时的额外操作
        '''
        if not self.isChecked():                    #按键的状态
            self.setText("连接网络")

        else:
            self.setText("断开网络")


class CounterResetLabel(QLabel):
    '''
    重写文本控件的部分方法
    '''
    clicked = pyqtSignal()
    def __init__(self,parent=None):
        '''
        初始化方法和属性
        '''
        super().__init__(parent)

    def mousePressEvent(self, event) -> None:
        '''
        鼠标点击的事件
        '''
        try:
            self.clicked.emit()                 #鼠标点击的事件，发送信号
        except Exception as ret:
            print(ret)
class PortInputDialog(QInputDialog):
    '''
    重写Dialog的方法
    '''
    def __init__(self,parent=None):
        '''
        初始化类的方法和属性
        '''
        super().__init__(parent)
        self.setInputMode(QInputDialog.IntInput)        #设置日志输入模式
        self.setIntMinimum(0)                           #设置最小数量为0
        self.setIntMaximum(65535)                       #设置最大数量为65535


